package com.av.client.frames;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.io.FileInputStream;
import java.util.logging.Level;

import javax.swing.JComboBox;
import javax.swing.JDesktopPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;

import org.hibernate.Hibernate;
import org.hibernate.lob.SerializableBlob;
import org.jdesktop.swingx.JXErrorPane;
import org.jdesktop.swingx.error.ErrorInfo;

import com.av.client.components.AvButton;
import com.av.client.components.AvComponent;
import com.av.client.components.AvLabel;
import com.av.client.util.idioma.Error;
import com.av.client.util.idioma.Etiqueta;
import com.av.client.util.idioma.ManejadorIdiomas;
import com.av.client.util.idioma.ManejadorIdiomas.IdiomaEvent;
import com.av.client.util.idioma.ManejadorIdiomas.IdiomaEventListener;
import com.av.client.util.sesion.AdministradorSesion;
import com.av.db.dataobjects.Adeudo;
import com.av.db.dataobjects.Imagen;
import com.av.db.dataobjects.Tarjeta;
import com.av.db.dataobjects.enums.Rol;
import com.av.exceptions.AvException;
import com.av.rmi.CatalogoAcciones;
import com.av.rmi.Parametro;
import com.av.rmi.Parametro.Tipo;

@SuppressWarnings("serial")
public class ImagenFrame extends JInternalFrame {

	private static final int WIDTH = 375;
	private static final int HEIGHT = 200;

	private AvLabel lblTarjeta;
	private JComboBox cboTarjeta;
	private AvLabel lblAdeudo;
	private JComboBox cboAdeudo;
	private AvLabel lblArchivo;
	private JTextField txtArchivo;
	private JFileChooser fc;
	private AvButton btnBuscar;
	private AvButton btnAgregar;
	private AvButton btnCerrar;

	private ManejadorIdiomas mi;
	private BotonHandler bh = new BotonHandler();
	private Imagen imagen;
	private File archivoSeleccionado;

	public ImagenFrame() {
		super();
		mi = ManejadorIdiomas.getInstance();
		initComponents();
		addListeners();
		cargarPermisos();
		limpiarTextos();
	}// ImagenFrame

	/**
	 * Funcion que habilita o deshabilita los componentes de acuerdo a sus
	 * permisos asignados
	 */
	private void cargarPermisos() {
		if (AdministradorSesion.getInstance().getSesionActiva() != null) {
			Rol r = AdministradorSesion.getInstance().getSesionActiva()
					.getUsuario().getRol();
			for (Component c : this.getContentPane().getComponents()) {
				if (c instanceof JPanel) {
					for (Component c2 : ((JPanel) c).getComponents()) {
						if (c2 instanceof AvComponent) {
							c2.setEnabled(((AvComponent) c2).contains(r));
						}
					}
				} else if (c instanceof AvComponent) {
					c.setEnabled(((AvComponent) c).contains(r));
				}
			}
		}
	}// cargarPermisos

	private void limpiarTextos() {
		cboTarjeta.setSelectedIndex(-1);
		txtArchivo.setText("");
		archivoSeleccionado = null;
	}// limpiarTextos

	private void initComponents() {
		setTitle(mi.obtenerEtiqueta(Etiqueta.IMAGEN_FRAME_TITLE));
		setLayout(new GridBagLayout());
		GridBagConstraints gc = new GridBagConstraints();

		gc.insets = new Insets(5, 5, 5, 5);
		gc.fill = GridBagConstraints.HORIZONTAL;

		// Tarjeta
		gc.gridx = 0;
		lblTarjeta = new AvLabel(Etiqueta.IMAGEN_FRAME_LBL_TARJETA);
		add(lblTarjeta, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		gc.gridwidth = 2;
		cboTarjeta = new JComboBox(obtenerTarjetasActivas());
		cboTarjeta.addItemListener(new ItemListener() {
			@Override
			public void itemStateChanged(ItemEvent e) {
				if (cboTarjeta.getSelectedItem() != null) {
					cboAdeudo.removeAllItems();
					for (Adeudo a : obtenerAdeudos((Tarjeta) cboTarjeta
							.getSelectedItem())) {
						cboAdeudo.addItem(a);
					}
				}
			}
		});
		add(cboTarjeta, gc);
		gc.weightx = 0.0;
		gc.gridwidth = 1;

		// Adeudo
		gc.gridy = 1;
		gc.gridx = 0;
		lblAdeudo = new AvLabel(Etiqueta.IMAGEN_FRAME_LBL_ADEUDO);
		add(lblAdeudo, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		gc.gridwidth = 2;
		cboAdeudo = new JComboBox();
		add(cboAdeudo, gc);
		gc.weightx = 0.0;
		gc.gridwidth = 1;

		// Archivo
		gc.gridy = 2;
		gc.gridx = 0;
		lblArchivo = new AvLabel(Etiqueta.IMAGEN_FRAME_LBL_ARCHIVO);
		add(lblArchivo, gc);

		gc.gridx = 1;
		gc.weightx = 1.0;
		txtArchivo = new JTextField();
		txtArchivo.setEditable(false);
		add(txtArchivo, gc);
		gc.weightx = 0.0;

		gc.gridx = 2;
		btnBuscar = new AvButton(Etiqueta.IMAGEN_FRAME_BTN_BUSCAR);
		btnBuscar.loadPermisos();
		add(btnBuscar, gc);

		// FileChooser
		fc = new JFileChooser();
		fc.setAcceptAllFileFilterUsed(false);
		fc
				.setFileFilter(new FileNameExtensionFilter("JPEG file", "jpg",
						"jpeg"));

		// Agregar
		JPanel jpnl = new JPanel(new FlowLayout());

		btnAgregar = new AvButton(Etiqueta.IMAGEN_FRAME_BTN_AGREGAR);
		btnAgregar.addPermiso(Rol.ADMIN);
		jpnl.add(btnAgregar);

		btnCerrar = new AvButton(Etiqueta.IMAGEN_FRAME_BTN_CERRAR);
		btnCerrar.loadPermisos();
		jpnl.add(btnCerrar);

		gc.gridy = 3;
		gc.gridx = 0;
		gc.gridwidth = 3;
		gc.weightx = 1.0;
		add(jpnl, gc);
		gc.gridwidth = 1;
		gc.weightx = 0.0;

		setClosable(false);
		setSize(WIDTH, HEIGHT);
	}// initComponents

	/**
	 * Funcion que obtiene todas las tarjetas activas del sistema
	 * 
	 * @return
	 */
	private Tarjeta[] obtenerTarjetasActivas() {
		Tarjeta[] tmp = new Tarjeta[1];
		Parametro p = new Parametro();

		if (AdministradorSesion.getInstance().getSesionActiva() != null) {
			try {
				p.setAccion(CatalogoAcciones.OBTENER_ACTIVOS_TARJETA);
				p = AdministradorSesion.getInstance().getSesionActiva()
						.ejecutar(p);
				if (p.getValor(Tipo.OUTPUT) != null) {
					tmp = (Tarjeta[]) p.getValor(Tipo.OUTPUT);
				}
			} catch (AvException e) {
				ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR", e
						.getMessage(), null, null, e, Level.INFO, null);
				JXErrorPane.setDefaultLocale(mi.getIdioma().getLocale());
				JXErrorPane.showDialog(getParent(), info);
			}
		}

		return tmp;
	}// obtenerTarjetasActivas

	private Adeudo[] obtenerAdeudos(Tarjeta t) {
		Adeudo[] tmp = new Adeudo[1];
		Parametro p = new Parametro();

		if (t == null) {
			return tmp;
		}

		if (AdministradorSesion.getInstance().getSesionActiva() != null) {
			try {
				p.setAccion(CatalogoAcciones.OBTENER_ADEUDO_POR_TARJETA);
				p.setValor(Tipo.INPUT, t);
				p = AdministradorSesion.getInstance().getSesionActiva()
						.ejecutar(p);
				if (p.getValor(Tipo.OUTPUT) != null) {
					tmp = (Adeudo[]) p.getValor(Tipo.OUTPUT);
				}
			} catch (AvException e) {
				ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR", e
						.getMessage(), null, null, e, Level.INFO, null);
				JXErrorPane.setDefaultLocale(mi.getIdioma().getLocale());
				JXErrorPane.showDialog(getParent(), info);
			}
		}

		return tmp;
	}// obtenerAdeudos

	private void addListeners() {
		mi.addIdiomaEventListener(new IdiomaEventListener() {
			@Override
			public void changedIdiomaEvent(IdiomaEvent evt) {
				setLabels();
			}
		});

		btnBuscar.addActionListener(bh);
		btnAgregar.addActionListener(bh);
		btnCerrar.addActionListener(bh);
	}// addListeners

	private void setLabels() {
		setTitle(mi.obtenerEtiqueta(Etiqueta.IMAGEN_FRAME_TITLE));
		lblAdeudo.setText(Etiqueta.IMAGEN_FRAME_LBL_ADEUDO);
		lblArchivo.setText(Etiqueta.IMAGEN_FRAME_LBL_ARCHIVO);
		lblTarjeta.setText(Etiqueta.IMAGEN_FRAME_LBL_TARJETA);
	}// setLabels

	private class BotonHandler implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent ev) {
			Object o = ev.getSource();
			if (o instanceof AvButton) {
				if (o == btnCerrar) {
					dispose();
				} else if (o == btnAgregar) {
					try {
						validarTextos();
						agregarImagen();
					} catch (AvException e) {
						ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR",
								e.getMessage(), null, null, e, Level.WARNING,
								null);
						JXErrorPane
								.setDefaultLocale(mi.getIdioma().getLocale());
						JXErrorPane.showDialog(getParent(), info);
					}
				} else if (o == btnBuscar) {
					int returnVal = fc.showOpenDialog(ImagenFrame.this);

					if (returnVal == JFileChooser.APPROVE_OPTION) {
						archivoSeleccionado = fc.getSelectedFile();
						txtArchivo.setText(archivoSeleccionado
								.getAbsolutePath());
					}
				}
			}
		}// actionPerformed
	}// BotonHandler

	/**
	 * Valida los campos ingresados por el usuario
	 * 
	 * @throws AvException
	 */
	private void validarTextos() throws AvException {
		if (cboAdeudo.getSelectedIndex() < 0) {
			cboAdeudo.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.IMAGEN_FRAME_CBO_ADEUDO));
		}

		if (txtArchivo.getText() == null
				|| txtArchivo.getText().trim().length() == 0) {
			btnBuscar.requestFocus();
			throw new AvException(mi
					.obtenerError(Error.IMAGEN_FRAME_TXT_ARCHIVO));
		}
	}// validarTextos

	public void agregarImagen() throws AvException {
		Parametro p = new Parametro();
		p.setAccion(CatalogoAcciones.AGREGAR_IMAGEN);
		p.setValor(Tipo.INPUT, getImagen());
		AdministradorSesion.getInstance().getSesionActiva().ejecutar(p);
		limpiarTextos();
	}// agregarImagen

	private Imagen getImagen() {
		if (imagen == null) {
			imagen = new Imagen();
		}

		imagen.setImagen(convertirImagen(archivoSeleccionado));
		imagen.setAdeudo((Adeudo) cboAdeudo.getSelectedItem());

		return imagen;
	}// getImagen

	private SerializableBlob convertirImagen(File f) {
		SerializableBlob b = null;

		try {
			b = new SerializableBlob(Hibernate
					.createBlob(new FileInputStream(f)));
		} catch (Exception e) {
			ErrorInfo info = new ErrorInfo(getTitle() + " - ERROR", e
					.getMessage(), null, null, e, Level.WARNING, null);
			JXErrorPane.setDefaultLocale(mi.getIdioma().getLocale());
			JXErrorPane.showDialog(getParent(), info);
		}

		return b;
	}// convertirImagen

	public static void main(String[] args) {
		JFrame tmp = new JFrame("Test");
		tmp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JDesktopPane desktop = new JDesktopPane();
		desktop.setBackground(Color.GRAY);
		desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
		tmp.setContentPane(desktop);

		ImagenFrame imgf = new ImagenFrame();
		imgf.setVisible(true);
		desktop.add(imgf);
		try {
			imgf.setSelected(true);
		} catch (PropertyVetoException e) {
		}
		tmp
				.setSize(new Dimension(imgf.getWidth() + 100,
						imgf.getHeight() + 100));
		tmp.setVisible(true);
	}// main

}// ImagenFrame